<?php
declare (strict_types=1);

namespace app\api\common\middleware;

use app\Request;
use think\facade\Request as FacadeRequest;

class AdminAuthPermissionMiddleware
{
    /*
    use \app\common\traits\Base;

    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle(Request $request, \Closure $next)
    {
        //没有这个路由，则直接返回（由miss路由处理）
        if ($request->rule()->getRule() === null) {
            return $next($request);
        }

        //当前匹配的路由 和 方法
        $rule   = trim(strtolower($request->rule()->getRule()));
        $method = trim(strtolower($request->method()));
        //!!!跳过的 url
        $unrestricted = [
            'v1/setting/admin/logout',
            'v1/menuslist',
            'v1/setting/Permission/permission',
            'setting/permission/rule',//菜单获取
            'setting/message',
            'setting/config/get/<name>',
        ];
        if (in_array($rule, $unrestricted)) {
            return $next($request);
        }

        //可以将其放入Redis
        $admin = \think\facade\Db::connect('mysql')
            ->name('admin_role')
            ->field('rules, level')
            ->whereIn('id', explode(',', $request->AdminInfo['roles'] ?? ''))
            ->find();

        //超级管理员
        if ($admin["level"] === 0) {
            return $next($request);
        }

        $ruleIds = explode(',', $admin["rules"]);

        //所有权限（包含api_url和method两个字段）
        $auth = \think\facade\Db::connect('mysql')
            ->name('admin_permission')
            ->field('api_path, methods')
            ->where('status', 1)
            ->where('type', 2)
            ->whereIn('id', $ruleIds)
            ->where('delete_time', null)
            ->select()
            ->toArray();

        //验证访问接口是否存在
        if (!in_array($rule,    //$rule是否在 $auth 的 所有 api_url 字段中
            array_map(function ($item) {
                return trim(strtolower(str_replace(' ', '', $item)));   //去除空格、小写
            },
                array_column($auth, 'api_path'))))  //提取 $auth 的 api_url 字段
        {
            return ret_value(-1, "接口无权限", null, 400);
        }
        //验证访问接口是否有权限
        if (empty(
            //过滤所有 $auth，不为空则有权
        array_filter($auth, function ($item) use ($rule, $method) {
            //判断 api_url 和 method
            if (trim(strtolower($item['api_path'])) === $rule && $method === trim(strtolower($item['methods'])))
                return true;
        }))) {
            return ret_value(-2, "接口无权限", null, 401);
        }
        return $next($request);
    }
}
